<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="generator" content="pdoc 14.1.0"/>
    <title>pricegenerator.PriceGenerator API documentation</title>
            <link rel="icon" href="https://github.com/Tim55667757/PriceGenerator/blob/develop/media/logo-pricegenerator-256x256px.png?raw=true"/>

    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pdoc-code .cp{color:#9C6500}.pdoc-code .cpf{color:#3D7B7B; font-style:italic}.pdoc-code .c1{color:#3D7B7B; font-style:italic}.pdoc-code .cs{color:#3D7B7B; font-style:italic}.pdoc-code .gd{color:#A00000}.pdoc-code .ge{font-style:italic}.pdoc-code .gr{color:#E40000}.pdoc-code .gh{color:#000080; font-weight:bold}.pdoc-code .gi{color:#008400}.pdoc-code .go{color:#717171}.pdoc-code .gp{color:#000080; font-weight:bold}.pdoc-code .gs{font-weight:bold}.pdoc-code .gu{color:#800080; font-weight:bold}.pdoc-code .gt{color:#0044DD}.pdoc-code .kc{color:#008000; font-weight:bold}.pdoc-code .kd{color:#008000; font-weight:bold}.pdoc-code .kn{color:#008000; font-weight:bold}.pdoc-code .kp{color:#008000}.pdoc-code .kr{color:#008000; font-weight:bold}.pdoc-code .kt{color:#B00040}.pdoc-code .m{color:#666666}.pdoc-code .s{color:#BA2121}.pdoc-code .na{color:#687822}.pdoc-code .nb{color:#008000}.pdoc-code .nc{color:#0000FF; font-weight:bold}.pdoc-code .no{color:#880000}.pdoc-code .nd{color:#AA22FF}.pdoc-code .ni{color:#717171; font-weight:bold}.pdoc-code .ne{color:#CB3F38; font-weight:bold}.pdoc-code .nf{color:#0000FF}.pdoc-code .nl{color:#767600}.pdoc-code .nn{color:#0000FF; font-weight:bold}.pdoc-code .nt{color:#008000; font-weight:bold}.pdoc-code .nv{color:#19177C}.pdoc-code .ow{color:#AA22FF; font-weight:bold}.pdoc-code .w{color:#bbbbbb}.pdoc-code .mb{color:#666666}.pdoc-code .mf{color:#666666}.pdoc-code .mh{color:#666666}.pdoc-code .mi{color:#666666}.pdoc-code .mo{color:#666666}.pdoc-code .sa{color:#BA2121}.pdoc-code .sb{color:#BA2121}.pdoc-code .sc{color:#BA2121}.pdoc-code .dl{color:#BA2121}.pdoc-code .sd{color:#BA2121; font-style:italic}.pdoc-code .s2{color:#BA2121}.pdoc-code .se{color:#AA5D1F; font-weight:bold}.pdoc-code .sh{color:#BA2121}.pdoc-code .si{color:#A45A77; font-weight:bold}.pdoc-code .sx{color:#008000}.pdoc-code .sr{color:#A45A77}.pdoc-code .s1{color:#BA2121}.pdoc-code .ss{color:#19177C}.pdoc-code .bp{color:#008000}.pdoc-code .fm{color:#0000FF}.pdoc-code .vc{color:#19177C}.pdoc-code .vg{color:#19177C}.pdoc-code .vi{color:#19177C}.pdoc-code .vm{color:#19177C}.pdoc-code .il{color:#666666}</style>
    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;z-index:999;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;opacity:0;}nav.pdoc{--pad:clamp(0.5rem, 2vw, 1.75rem);--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent; z-index:1}nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc > div > ul{margin-left:calc(0px - var(--pad));}nav.pdoc li a{padding:.2rem 0 .2rem calc(var(--pad) + var(--indent));}nav.pdoc > div > ul > li > a{padding-left:var(--pad);}nav.pdoc li{transition:all 100ms;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{cursor:pointer;display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bottom:0;}.pdoc .pdoc-alert-note {color:#084298;background-color:#cfe2ff;border-color:#b6d4fe;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23084298%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8%2016A8%208%200%201%200%208%200a8%208%200%200%200%200%2016zm.93-9.412-1%204.705c-.07.34.029.533.304.533.194%200%20.487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703%200-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381%202.29-.287zM8%205.5a1%201%200%201%201%200-2%201%201%200%200%201%200%202z%22/%3E%3C/svg%3E");}.pdoc .pdoc-alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23664d03%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8.982%201.566a1.13%201.13%200%200%200-1.96%200L.165%2013.233c-.457.778.091%201.767.98%201.767h13.713c.889%200%201.438-.99.98-1.767L8.982%201.566zM8%205c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%205.995A.905.905%200%200%201%208%205zm.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2z%22/%3E%3C/svg%3E");}.pdoc .pdoc-alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23842029%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M5.52.359A.5.5%200%200%201%206%200h4a.5.5%200%200%201%20.474.658L8.694%206H12.5a.5.5%200%200%201%20.395.807l-7%209a.5.5%200%200%201-.873-.454L6.823%209.5H3.5a.5.5%200%200%201-.48-.641l2.5-8.5z%22/%3E%3C/svg%3E");}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc > section:not(.module-info) h1{font-size:1.5rem;font-weight:500;}.pdoc > section:not(.module-info) h2{font-size:1.4rem;font-weight:500;}.pdoc > section:not(.module-info) h3{font-size:1.3rem;font-weight:500;}.pdoc > section:not(.module-info) h4{font-size:1.2rem;}.pdoc > section:not(.module-info) h5{font-size:1.1rem;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--accent);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc > section:not(.module-info){margin-bottom:1.5rem;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.view-source-toggle-state,.view-source-toggle-state ~ .pdoc-code{display:none;}.view-source-toggle-state:checked ~ .pdoc-code{display:block;}.view-source-button{display:inline-block;float:right;font-size:.75rem;line-height:1.5rem;color:var(--muted);padding:0 .4rem 0 1.3rem;cursor:pointer;text-indent:-2px;}.view-source-button > span{visibility:hidden;}.module-info .view-source-button{float:none;display:flex;justify-content:flex-end;margin:-1.2rem .4rem -.2rem 0;}.view-source-button::before{position:absolute;content:"View Source";display:list-item;list-style-type:disclosure-closed;}.view-source-toggle-state:checked ~ .attr .view-source-button::before,.view-source-toggle-state:checked ~ .view-source-button::before{list-style-type:disclosure-open;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc section:not(.module-info) .docstring{margin-left:clamp(0rem, 5vw - 2rem, 1rem);}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target,.pdoc .pdoc-code > pre > span:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc .pdoc-code > pre > span:target{display:block;}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc *{scroll-margin:2rem;}.pdoc .pdoc-code .linenos{user-select:none;}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc section, .pdoc .classattr{position:relative;}.pdoc .headerlink{--width:clamp(1rem, 3vw, 2rem);position:absolute;top:0;left:calc(0rem - var(--width));transition:all 100ms ease-in-out;opacity:0;}.pdoc .headerlink::before{content:"#";display:block;text-align:center;width:var(--width);height:2.3rem;line-height:2.3rem;font-size:1.5rem;}.pdoc .attr:hover ~ .headerlink,.pdoc *:target > .headerlink,.pdoc .headerlink:hover{opacity:1;}.pdoc .attr{display:block;margin:.5rem 0 .5rem;padding:.4rem .4rem .4rem 1rem;background-color:var(--accent);overflow-x:auto;}.pdoc .classattr{margin-left:2rem;}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{background-color:transparent;}.pdoc .param, .pdoc .return-annotation{white-space:pre;}.pdoc .signature.multiline .param{display:block;}.pdoc .signature.condensed .param{display:inline-block;}.pdoc .annotation{color:var(--annotation);}.pdoc .view-value-toggle-state,.pdoc .view-value-toggle-state ~ .default_value{display:none;}.pdoc .view-value-toggle-state:checked ~ .default_value{display:inherit;}.pdoc .view-value-button{font-size:.5rem;vertical-align:middle;border-style:dashed;margin-top:-0.1rem;}.pdoc .view-value-button:hover{background:white;}.pdoc .view-value-button::before{content:"show";text-align:center;width:2.2em;display:inline-block;}.pdoc .view-value-toggle-state:checked ~ .view-value-button::before{content:"hide";}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
    <style>/*! custom.css */</style></head>
<body>
    <nav class="pdoc">
        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
        <div>            <a class="pdoc-button module-list-button" href="../pricegenerator.html">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
</svg>                &nbsp;pricegenerator</a>

            <img src="https://github.com/Tim55667757/PriceGenerator/blob/develop/media/logo-pricegenerator-420x610px.png?raw=true" class="logo" alt="project logo"/>

            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
                   pattern=".+" required>



            <h2>API Documentation</h2>
                <ul class="memberlist">
            <li>
                    <a class="variable" href="#uLogger">uLogger</a>
            </li>
            <li>
                    <a class="variable" href="#GOOGLE_TEMPLATE_J2">GOOGLE_TEMPLATE_J2</a>
            </li>
            <li>
                    <a class="class" href="#PriceGenerator">PriceGenerator</a>
                            <ul class="memberlist">
                        <li>
                                <a class="function" href="#PriceGenerator.__init__">PriceGenerator</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.prices">prices</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.csvHeaders">csvHeaders</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.dfHeaders">dfHeaders</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.sep">sep</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.j2template">j2template</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.j2model">j2model</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.ticker">ticker</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.timeframe">timeframe</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.timeStart">timeStart</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.horizon">horizon</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.trendSplit">trendSplit</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.splitCount">splitCount</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.maxClose">maxClose</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.minClose">minClose</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.initClose">initClose</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.maxOutlier">maxOutlier</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.maxCandleBody">maxCandleBody</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.upCandlesProb">upCandlesProb</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.outliersProb">outliersProb</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.trendDeviation">trendDeviation</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.maxVolume">maxVolume</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.stat">stat</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.precision">precision</a>
                        </li>
                        <li>
                                <a class="variable" href="#PriceGenerator.zigZagDeviation">zigZagDeviation</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.FormattedDelta">FormattedDelta</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.DetectPrecision">DetectPrecision</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.DetectTimeframe">DetectTimeframe</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.LoadFromFile">LoadFromFile</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.SaveToFile">SaveToFile</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.GetTrend">GetTrend</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.ZigZagFilter">ZigZagFilter</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.GetStatistics">GetStatistics</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.Generate">Generate</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.RenderBokeh">RenderBokeh</a>
                        </li>
                        <li>
                                <a class="function" href="#PriceGenerator.RenderGoogle">RenderGoogle</a>
                        </li>
                </ul>

            </li>
            <li>
                    <a class="function" href="#ParseArgs">ParseArgs</a>
            </li>
            <li>
                    <a class="function" href="#Main">Main</a>
            </li>
    </ul>


            <footer>⚙ Good luck for you in trade automation! And profit!</footer>

        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev" target="_blank">
            built with <span class="visually-hidden">pdoc</span><img
                alt="pdoc logo"
                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
        </a>
</div>
    </nav>
    <main class="pdoc">
            <section class="module-info">
                    <h1 class="modulename">
<a href="./../pricegenerator.html">pricegenerator</a><wbr>.PriceGenerator    </h1>

                        <div class="docstring"><p><strong>PriceGenerator</strong> is the platform for generating prices similar to real stock prices, but you can control the statistics of their distribution. Generates chain of candlesticks with predefined statistical parameters, return Pandas DataFrame or saving as .CSV-file with OHLCV-candlestick in every string. Use PriceGenerator to generate synthetic data to test your trading strategy.</p>

<p>In additional you can view some statistical and probability parameters of generated or loaded prices.</p>

<p>Sample example:</p>

<p><a href="https://github.com/Tim55667757/PriceGenerator"><img src="https://github.com/Tim55667757/PriceGenerator/blob/master/media/index_google.html.png?raw=true" alt="Chart" width="780" target="_blank" /></a></p>

<p><a href="https://yoomoney.ru/fundraise/BxB9DQNvJnk.230111"><img src="https://badgen.net/badge/gift/donate/green" alt="gift" /></a></p>
</div>

                
                
                
            </section>
                <section id="uLogger">
                    <div class="attr variable">
            <span class="name">uLogger</span>        =
<span class="default_value">&lt;Logger PriceGenerator-UniLogger (DEBUG)&gt;</span>

        
    </div>
    <a class="headerlink" href="#uLogger"></a>
    
    

                </section>
                <section id="GOOGLE_TEMPLATE_J2">
                    <div class="attr variable">
            <span class="name">GOOGLE_TEMPLATE_J2</span>        =
<input id="GOOGLE_TEMPLATE_J2-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
            <label class="view-value-button pdoc-button" for="GOOGLE_TEMPLATE_J2-view-value"></label><span class="default_value">&#39;{# This template based on Jinja markup language: https://jinja.palletsprojects.com/en/latest/ #}\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n\n&lt;head&gt;\n    &lt;title&gt;{{ title }}&lt;/title&gt;\n    &lt;meta charset=&#34;utf-8&#34;&gt;\n    &lt;script type=&#34;text/javascript&#34; src=&#34;https://code.jquery.com/jquery-latest.min.js&#34;&gt;&lt;/script&gt;\n    &lt;script type=&#34;text/javascript&#34; src=&#34;https://www.gstatic.com/charts/loader.js&#34;&gt;&lt;/script&gt;\n    &lt;script type=&#34;text/javascript&#34;&gt;google.charts.load(\&#39;current\&#39;, {\&#39;packages\&#39;: [\&#39;corechart\&#39;]});&lt;/script&gt;\n    &lt;style type=&#34;text/css&#34;&gt;\n    #preloader {\n        position: fixed;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        background-color: #FFFFFF;\n        z-index: 99;\n    }\n    #status {\n        width: 300px;\n        height: 150px;\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        background-image: url(https://raw.githubusercontent.com/niklausgerber/PreLoadMe/master/img/status.gif);\n        background-repeat: no-repeat;\n        background-position: left;\n        margin: -100px 0 0 -100px;\n        font-family: &#34;Segoe UI&#34;, &#34;Frutiger&#34;, &#34;Frutiger Linotype&#34;, &#34;Dejavu Sans&#34;, &#34;Helvetica Neue&#34;, &#34;Arial&#34;, sans-serif;\n        font-size: 14px;\n    }\n    pre {\n        font-family: &#34;Lucida Console&#34;, sans-serif;\n        font-size: 11px;\n        padding: 0;\n        border-width: 0 0 0 0;\n    }\n    table {\n        font-family: &#34;Segoe UI&#34;, &#34;Frutiger&#34;, &#34;Frutiger Linotype&#34;, &#34;Dejavu Sans&#34;, &#34;Helvetica Neue&#34;, &#34;Arial&#34;, sans-serif;\n        font-size: 12px;\n        border-spacing: 0;\n        text-align: left;\n        background: white;\n        width: 100%;\n    }\n    th {\n        border-radius: 10px 10px 10px 10px;\n        border-style: solid;\n        border-width: 0 1px 1px 0;\n        border-color: white;\n        padding: 6px;\n        vertical-align: middle;\n        padding-left: 1em;\n        background: #E6E6E6;\n        height: 50px;\n    }\n    td {\n        border-radius: 10px 10px 10px 10px;\n        border-style: solid;\n        border-width: 0 1px 1px 0;\n        border-color: white;\n        padding: 6px;\n        vertical-align: top;\n        padding-left: 1em;\n        background: white;\n    }\n    &lt;/style&gt;\n    &lt;script&gt;\n    function drawChartCandlesticks(candlesData) {\n        var chartOptions = {\n            legend: &#34;none&#34;,\n            titlePosition: &#34;in&#34;,\n            chartArea: {width: &#34;100%&#34;, height: &#34;100%&#34;},\n            fontSize: 11,\n            candlestick: {\n                fallingColor: {stroke: &#34;#000000&#34;, strokeWidth: 1, fill: &#34;#999999&#34;},\n                risingColor: {stroke: &#34;#000000&#34;,  strokeWidth: 1, fill: &#34;#FFFFFF&#34;},\n            },\n            colors: [&#34;#000000&#34;],\n            hAxis: {textPosition: &#34;none&#34;},\n            vAxis: {textPosition: &#34;in&#34;, textStyle: {fontSize: 12}},\n        }\n        if (typeof candlesData !== &#34;undefined&#34;) {\n            var data = google.visualization.arrayToDataTable(candlesData, true);\n            var chart = new google.visualization.CandlestickChart(document.getElementById(&#34;candlestickChart&#34;));\n            chart.draw(data, chartOptions);\n        }\n    }\n    &lt;/script&gt;\n&lt;/head&gt;\n\n\n&lt;body onload=&#34;drawChartCandlesticks({{ candlesData }})&#34;&gt;\n\n\n&lt;!-- Preloader --&gt;\n&lt;script&gt;\n    $(window).on(\&#39;load\&#39;, function() {\n        $(\&#39;#status\&#39;).fadeOut(\&#39;slow\&#39;);\n        $(\&#39;#preloader\&#39;).fadeOut(\&#39;slow\&#39;);\n    })\n&lt;/script&gt;\n&lt;div id=&#34;preloader&#34;&gt;\n    &lt;div id=&#34;status&#34;&gt;Wait...&lt;/div&gt;\n&lt;/div&gt;\n\n\n&lt;!-- Chart part --&gt;\n\n&lt;table id=&#34;chart&#34;&gt;\n    &lt;tr&gt;\n        &lt;th style=&#34;width: 80%;&#34;&gt;\n            &lt;b&gt;{{ title }}&lt;/b&gt;\n        &lt;/th&gt;\n        &lt;th&gt;\n            &lt;b&gt;Info&lt;/b&gt;\n        &lt;/th&gt;\n    &lt;/tr&gt;\n    &lt;tr&gt;\n        &lt;td&gt;\n            &lt;div id=&#34;candlestickChart&#34; style=&#34;height: 800px; width: 100%;&#34;&gt;&lt;/div&gt;\n        &lt;/td&gt;\n        &lt;td&gt;\n            {% for line in info %}\n                &lt;pre&gt;{{ line }}&lt;/pre&gt;\n            {% endfor %}\n        &lt;/td&gt;\n    &lt;/tr&gt;\n&lt;/table&gt;\n\n\n&lt;!-- Footer --&gt;\n\n&lt;table&gt;\n    &lt;tr&gt;\n        &lt;th&gt;&lt;b&gt;Generated by &lt;a href=&#34;https://github.com/Tim55667757/PriceGenerator&#34;&gt;PriceGenerator&lt;/a&gt;&lt;/b&gt;&lt;/th&gt;\n    &lt;/tr&gt;\n&lt;/table&gt;\n\n\n&lt;/body&gt;\n\n&lt;/html&gt;\n&#39;</span>

        
    </div>
    <a class="headerlink" href="#GOOGLE_TEMPLATE_J2"></a>
    
    

                </section>
                <section id="PriceGenerator">
                    <div class="attr class">
            
    <span class="def">class</span>
    <span class="name">PriceGenerator</span>:

        
    </div>
    <a class="headerlink" href="#PriceGenerator"></a>
    
            <div class="docstring"><p>This class implements methods to generation of prices statistically similar to real ones.</p>

<p><strong>Model generated: OHLCV-candlesticks (open, high, low, close, volume).</strong></p>
</div>


                            <div id="PriceGenerator.__init__" class="classattr">
                                <div class="attr function">
            
        <span class="name">PriceGenerator</span><span class="signature pdoc-code condensed">()</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.__init__"></a>
    
            <div class="docstring"><p>Main class init.</p>
</div>


                            </div>
                            <div id="PriceGenerator.prices" class="classattr">
                                <div class="attr variable">
            <span class="name">prices</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.prices"></a>
    
            <div class="docstring"><p>Generated or loaded prices will be available in this Pandas DataFrame variable.</p>
</div>


                            </div>
                            <div id="PriceGenerator.csvHeaders" class="classattr">
                                <div class="attr variable">
            <span class="name">csvHeaders</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.csvHeaders"></a>
    
            <div class="docstring"><p>Headers in .CSV-file. Default: <code>["date", "time", "open", "high", "low", "close", "volume"]</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.dfHeaders" class="classattr">
                                <div class="attr variable">
            <span class="name">dfHeaders</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.dfHeaders"></a>
    
            <div class="docstring"><p>Headers in Pandas DataFrame. Default: <code>["datetime", "open", "high", "low", "close", "volume"]</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.sep" class="classattr">
                                <div class="attr variable">
            <span class="name">sep</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.sep"></a>
    
            <div class="docstring"><p>Separator in csv - file. Default: <code>,</code></p>
</div>


                            </div>
                            <div id="PriceGenerator.j2template" class="classattr">
                                <div class="attr variable">
            <span class="name">j2template</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.j2template"></a>
    
            <div class="docstring"><p>Full path to custom jinja2 html-template file (e.g. <code>google_template_example.j2</code>) or just set here a long multi-string variable. Default: <code><a href="#GOOGLE_TEMPLATE_J2">GOOGLE_TEMPLATE_J2</a></code> is a multi-string variable with internal template.</p>
</div>


                            </div>
                            <div id="PriceGenerator.j2model" class="classattr">
                                <div class="attr variable">
            <span class="name">j2model</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.j2model"></a>
    
            <div class="docstring"><p>Dictionary of variables for jinja2 template. If <code>None</code> then used default variables for internal <code><a href="#GOOGLE_TEMPLATE_J2">GOOGLE_TEMPLATE_J2</a></code></p>
</div>


                            </div>
                            <div id="PriceGenerator.ticker" class="classattr">
                                <div class="attr variable">
            <span class="name">ticker</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.ticker"></a>
    
            <div class="docstring"><p>Some fake ticker name. Default: <code>Test</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.timeframe" class="classattr">
                                <div class="attr variable">
            <span class="name">timeframe</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.timeframe"></a>
    
            <div class="docstring"><p>Time delta between two neighbour candles. Default: <code>timedelta(hours=1)</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.timeStart" class="classattr">
                                <div class="attr variable">
            <span class="name">timeStart</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.timeStart"></a>
    
            <div class="docstring"><p>First date and time for candles chain.</p>
</div>


                            </div>
                            <div id="PriceGenerator.horizon" class="classattr">
                                <div class="attr variable">
            <span class="name">horizon</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.horizon"></a>
    
            <div class="docstring"><p>Candlesticks count in generated or loaded chain of prices, must be &gt;= 5. Default: <code>None</code> (means auto-detect length of chain if loaded from file).</p>
</div>


                            </div>
                            <div id="PriceGenerator.trendSplit" class="classattr">
                                <div class="attr variable">
            <span class="name">trendSplit</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.trendSplit"></a>
    
            <div class="docstring"><p>Set different trends, e.g. <code>trendSplit="/\-"</code> means that generated candles has uptrend at first part, next downtrend and then no trend. Used only together with <code><a href="#PriceGenerator.splitCount">splitCount</a></code> variable. Also, you can use words: <code>up</code>, <code>down</code>, <code>no</code> or chars: <code>u</code>, <code>d</code>, <code>n</code> with the hyphen symbol as separator, e.g. <code>trendSplit=up-down-no-up</code>, <code>trendSplit=u-d-n-u</code> etc. Default: <code>""</code>, empty string mean that will be used random trend directions.</p>
</div>


                            </div>
                            <div id="PriceGenerator.splitCount" class="classattr">
                                <div class="attr variable">
            <span class="name">splitCount</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.splitCount"></a>
    
            <div class="docstring"><p>Set candles count in different trends, e.g. <code>splitCount=[5, 10, 15]</code> means that generated candles has 3 trends with 5, 10 and 15 candles in chain, with sum must be equal to horizon. Used only together with <code><a href="#PriceGenerator.trendSplit">trendSplit</a></code> variable. Default: <code>[]</code>, empty list mean that will be used random candles count in trends.</p>
</div>


                            </div>
                            <div id="PriceGenerator.maxClose" class="classattr">
                                <div class="attr variable">
            <span class="name">maxClose</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.maxClose"></a>
    
            <div class="docstring"><p>Maximum of close prices must be &gt;= <code><a href="#PriceGenerator.minClose">minClose</a></code>. Default: random in interval <code>(70, 90)</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.minClose" class="classattr">
                                <div class="attr variable">
            <span class="name">minClose</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.minClose"></a>
    
            <div class="docstring"><p>Minimum of close prices must be &lt;= <code><a href="#PriceGenerator.maxClose">maxClose</a></code>. Default: random in interval <code>(60, 70)</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.initClose" class="classattr">
                                <div class="attr variable">
            <span class="name">initClose</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.initClose"></a>
    
            <div class="docstring"><p>First candle close price value. If <code>None</code> then used random number in interval between <code><a href="#PriceGenerator.minClose">minClose</a></code> and <code><a href="#PriceGenerator.maxClose">maxClose</a></code>. Default: <code>None</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.maxOutlier" class="classattr">
                                <div class="attr variable">
            <span class="name">maxOutlier</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.maxOutlier"></a>
    
            <div class="docstring"><p>Maximum size of outliers. If <code>None</code> then used value <code>(maxClose - minClose) / 10</code>. Default: <code>None</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.maxCandleBody" class="classattr">
                                <div class="attr variable">
            <span class="name">maxCandleBody</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.maxCandleBody"></a>
    
            <div class="docstring"><p>Maximum of candle body sizes: <code>abs(open - close)</code>. If <code>None</code> then used value <code>maxOutlier * 90%</code>. Default: <code>None</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.upCandlesProb" class="classattr">
                                <div class="attr variable">
            <span class="name">upCandlesProb</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.upCandlesProb"></a>
    
            <div class="docstring"><p>Probability that next candle is up. Default: <code>0.5</code> (means 50% of probability).</p>
</div>


                            </div>
                            <div id="PriceGenerator.outliersProb" class="classattr">
                                <div class="attr variable">
            <span class="name">outliersProb</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.outliersProb"></a>
    
            <div class="docstring"><p>Outlier probability (price tails). Default: <code>0.03</code> (means 3% of probability).</p>
</div>


                            </div>
                            <div id="PriceGenerator.trendDeviation" class="classattr">
                                <div class="attr variable">
            <span class="name">trendDeviation</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.trendDeviation"></a>
    
            <div class="docstring"><p>Relative deviation for trend detection. "NO trend" if <code>(1st_close - last_close) / 1st_close &lt;= self.trendDeviation</code>. Default: <code>0.005</code> (means ±0.5% of price deviation).</p>
</div>


                            </div>
                            <div id="PriceGenerator.maxVolume" class="classattr">
                                <div class="attr variable">
            <span class="name">maxVolume</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.maxVolume"></a>
    
            <div class="docstring"><p>Maximum of generated trade volumes. Default: random in interval <code>[1, 100000]</code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.stat" class="classattr">
                                <div class="attr variable">
            <span class="name">stat</span><span class="annotation">: dict</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.stat"></a>
    
            <div class="docstring"><p>Some statistics available after candles loaded or generated.</p>
</div>


                            </div>
                            <div id="PriceGenerator.precision" class="classattr">
                                <div class="attr variable">
            <span class="name">precision</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.precision"></a>
    
            <div class="docstring"><p>Signs after comma.</p>
</div>


                            </div>
                            <div id="PriceGenerator.zigZagDeviation" class="classattr">
                                <div class="attr variable">
            <span class="name">zigZagDeviation</span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.zigZagDeviation"></a>
    
            <div class="docstring"><p>Relative deviation to detection next points used by Zig-Zag indicator. Default: 0.03 (means 3% of price deviation).</p>
</div>


                            </div>
                            <div id="PriceGenerator.FormattedDelta" class="classattr">
                                <div class="attr function">
                    <div class="decorator">@staticmethod</div>

        <span class="def">def</span>
        <span class="name">FormattedDelta</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">tDelta</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span>, </span><span class="param"><span class="n">fmt</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.FormattedDelta"></a>
    
            <div class="docstring"><p>Pretty format for timedelta objects.</p>

<p>Example: <code>FormattedDelta(timedelta(days=2, hours=3, minutes=15, seconds=35), "{days} days {hours}:{minutes}:{seconds}") -&gt; "2 days 3:15:35"</code>.</p>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>timedelta object formatted as a string.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.DetectPrecision" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">DetectPrecision</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="bp">self</span>,</span><span class="param">	<span class="n">examples</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">series</span><span class="o">.</span><span class="n">Series</span><span class="p">,</span> <span class="nb">list</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="nb">int</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.DetectPrecision"></a>
    
            <div class="docstring"><p>Auto-detect precision from example values. E.g. <code>0.123 -&gt; 3</code>, <code>0.12345 -&gt; 5</code> and so on.
This method change <code><a href="#PriceGenerator.precision">precision</a></code> variable after detect precision.</p>

<p>See also about statistics.mode: <a href="https://docs.python.org/3.9/library/statistics.html#statistics.mode">https://docs.python.org/3.9/library/statistics.html#statistics.mode</a>
Changed in Python version &gt;= 3.8: Now mode() method handles multimodal datasets by returning the first mode encountered.
Previously, it raised StatisticsError when more than one mode was found.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>examples</strong>:  chain with examples of float values.</li>
</ul>
</div>


                            </div>
                            <div id="PriceGenerator.DetectTimeframe" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">DetectTimeframe</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.DetectTimeframe"></a>
    
            <div class="docstring"><p>Auto-detect time delta between last two neighbour candles.</p>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>timedelta object, also saved to <code><a href="#PriceGenerator.timeframe">timeframe</a></code>.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.LoadFromFile" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">LoadFromFile</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">fileName</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">DataFrame</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.LoadFromFile"></a>
    
            <div class="docstring"><p>Create Pandas OHLCV-model from CSV-file.
Default columns in CSV-file are <code>["date", "time", "open", "high", "low", "close", "volume"]</code>.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>fileName</strong>:  path to CSV-file with OHLCV columns.</li>
</ul>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>Pandas DataFrame.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.SaveToFile" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">SaveToFile</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">fileName</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.SaveToFile"></a>
    
            <div class="docstring"><p>Save Pandas OHLCV model to CSV-file.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>fileName</strong>:  path to CSV-file.</li>
</ul>
</div>


                            </div>
                            <div id="PriceGenerator.GetTrend" class="classattr">
                                <div class="attr function">
                    <div class="decorator">@staticmethod</div>

        <span class="def">def</span>
        <span class="name">GetTrend</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="n">firstClose</span><span class="p">:</span> <span class="nb">float</span>,</span><span class="param">	<span class="n">lastClose</span><span class="p">:</span> <span class="nb">float</span>,</span><span class="param">	<span class="n">trendDeviation</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">0.005</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.GetTrend"></a>
    
            <div class="docstring"><p>Get string with trend: <code>"UP trend"</code>, <code>"DOWN trend"</code> or <code>"NO trend"</code>.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>firstClose</strong>:  close of first candle.</li>
<li><strong>lastClose</strong>:  close of last candle.</li>
<li><strong>trendDeviation</strong>:  relative deviation for trend detection, 0.005 mean ±0.5% by default.</li>
</ul>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>string with trend direction <code>"NO trend"</code>, <code>"UP trend"</code> or <code>"DOWN trend"</code>.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.ZigZagFilter" class="classattr">
                                <div class="attr function">
                    <div class="decorator">@staticmethod</div>

        <span class="def">def</span>
        <span class="name">ZigZagFilter</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="n">datetimes</span><span class="p">:</span> <span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">series</span><span class="o">.</span><span class="n">Series</span>,</span><span class="param">	<span class="n">values</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">series</span><span class="o">.</span><span class="n">Series</span><span class="p">,</span> <span class="nb">list</span><span class="p">]</span>,</span><span class="param">	<span class="n">deviation</span><span class="p">:</span> <span class="nb">float</span></span><span class="return-annotation">) -> <span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">DataFrame</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.ZigZagFilter"></a>
    
            <div class="docstring"><p>This method filter input data as Zig-Zag indicator: when input value of candlestick price (e.g. close price)
is difference with next values with define percent then this point is a point of Zig-Zag indicator.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>datetimes</strong>:  input Pandas Series with datetime values.</li>
<li><strong>values</strong>:  input Pandas Series or list, e.g. list of closes values of candlesticks.</li>
<li><strong>deviation</strong>:  float number in <code>[0, 1]</code> interval is a relative difference between <code>i</code> and <code>i + 1</code> values to set as Zig-Zag point.</li>
</ul>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>Pandas DataFrame with two Series of filtered data <code>"datetimes": filtered_datetimes</code> and <code>"filtered": filtered_values</code>.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.GetStatistics" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">GetStatistics</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.GetStatistics"></a>
    
            <div class="docstring"><p>Calculates statistics of candles chain.</p>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>list with text in Markdown format with statistics.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.Generate" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">Generate</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">DataFrame</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.Generate"></a>
    
            <div class="docstring"><p>Main method to generating prices.</p>

<p>:return Pandas DataFrame object with OHLCV-candlestick in every row and also saving it to the <code><a href="#PriceGenerator.prices">prices</a></code>.</p>
</div>


                            </div>
                            <div id="PriceGenerator.RenderBokeh" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">RenderBokeh</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="bp">self</span>,</span><span class="param">	<span class="n">fileName</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;index.html&#39;</span>,</span><span class="param">	<span class="n">viewInBrowser</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param">	<span class="n">darkTheme</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param">	<span class="n">markers</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">lines</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="n">pandas</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">frame</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">title</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">width</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1800</span>,</span><span class="param">	<span class="n">height</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="mi">940</span>,</span><span class="param">	<span class="n">showControlsOnChart</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param">	<span class="n">showStatOnChart</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param">	<span class="n">inline</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="n">Optional</span><span class="p">[</span><span class="n">gridplot</span><span class="p">]</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.RenderBokeh"></a>
    
            <div class="docstring"><p>Rendering prices from Pandas DataFrame as OHLCV Bokeh chart of candlesticks and save it to HTML-file.
Pandas DataFrame in <code><a href="#PriceGenerator.prices">prices</a></code> variable must contain "datetime", "open", "high", "low", "close" and "volume" columns.</p>

<p>See also: <a href="https://docs.bokeh.org/en/latest/docs/gallery/candlestick.html">https://docs.bokeh.org/en/latest/docs/gallery/candlestick.html</a></p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>fileName</strong>:  HTML-file path to save Bokeh chart. <code>index.html</code> by default.</li>
<li><strong>viewInBrowser</strong>:  If <code>True</code>, then immediately opens HTML chart in browser after rendering. <code>False</code> by default.</li>
<li><strong>darkTheme</strong>:  chart theme. <code>False</code> by default, mean that will be used light theme, <code>False</code> mean dark theme.</li>
<li><strong>markers</strong>:  Pandas DataFrame with additional markers that will be placed on main series. <code>None</code> by default.
Marker is a custom symbol, example: ×, ↓ or ↑. Dataframe with markers must contain at least two columns.
There are <code>datetime</code> with date and time and some markers columns (<code>markersUpper</code>, <code>markersCenter</code> or <code>markersLower</code>).
Length of markers series must be equal to the length of main candles series.</li>
<li><strong>lines</strong>:  list with custom series, where additional chart-lines will place on main series. <code>None</code> by default.
Line data must contain at least two columns. There are <code>datetime</code> with date and time and
<code>custom_line_name</code> with y-coordinates. Length of the chart-line dataframes must be equal to the length of main candle series.</li>
<li><strong>title</strong>:  specific chart title. If <code>None</code>, then used auto-generated title. <code>None</code> by default.</li>
<li><strong>width</strong>:  chart width. If <code>None</code>, then used auto-width. 1800 px by default.</li>
<li><strong>height</strong>:  chart height. If <code>None</code>, then used auto-height. 940 px by default.</li>
<li><strong>showControlsOnChart</strong>:  enable controls block in legend to hide/show some elements on chart, <code>True</code> by default.</li>
<li><strong>showStatOnChart</strong>:  show statistics block on chart, <code>True</code> (by default) mean that will be calculating additional
series, like as Trend and Average Points. And some classical indicators, like as SMA, HMA,
VWMA, Bollinger Bands, Parabolic Stop and Reverse, Alligator and Zig-Zag indicator.
Warning! Calculate statistic takes more time. If you want to decrease chart rendering time,
then set this parameter to <code>False</code>.</li>
<li><strong>inline</strong>:  if <code>True</code>, then output chart in Jupyter Notebook cell. <code>False</code> by default.</li>
</ul>

<h6 id="returns">Returns</h6>

<blockquote>
  <p>bokeh.layouts.gridplot with all layouts objects or None.</p>
</blockquote>
</div>


                            </div>
                            <div id="PriceGenerator.RenderGoogle" class="classattr">
                                <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">RenderGoogle</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="bp">self</span>,</span><span class="param">	<span class="n">fileName</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;index.html&#39;</span>,</span><span class="param">	<span class="n">viewInBrowser</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param">	<span class="n">title</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>

        
    </div>
    <a class="headerlink" href="#PriceGenerator.RenderGoogle"></a>
    
            <div class="docstring"><p>Rendering prices from Pandas DataFrame as non-interactive Google Candlestick chart and save it to HTML-file.</p>

<p>See also: <a href="https://developers.google.com/chart/interactive/docs/gallery/candlestickchart">https://developers.google.com/chart/interactive/docs/gallery/candlestickchart</a></p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>fileName</strong>:  HTML-file path to save Google Candlestick chart.</li>
<li><strong>viewInBrowser</strong>:  If <code>True</code>, then immediately opens html in browser after rendering.</li>
<li><strong>title</strong>:  specific chart title. If <code>None</code>, then used auto-generated title. <code>None</code> by default.</li>
</ul>
</div>


                            </div>
                </section>
                <section id="ParseArgs">
                    <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">ParseArgs</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>

        
    </div>
    <a class="headerlink" href="#ParseArgs"></a>
    
            <div class="docstring"><p>This function get and parse command line keys.</p>
</div>


                </section>
                <section id="Main">
                    <div class="attr function">
            
        <span class="def">def</span>
        <span class="name">Main</span><span class="signature pdoc-code condensed">(<span class="return-annotation">):</span></span>

        
    </div>
    <a class="headerlink" href="#Main"></a>
    
            <div class="docstring"><p>Main function for work with PriceGenerator in the console.</p>

<p>See examples:</p>

<ul>
<li>in english: <a href="https://github.com/Tim55667757/PriceGenerator/blob/master/README.md">https://github.com/Tim55667757/PriceGenerator/blob/master/README.md</a></li>
<li>in russian: <a href="https://github.com/Tim55667757/PriceGenerator/blob/master/README_RU.md">https://github.com/Tim55667757/PriceGenerator/blob/master/README_RU.md</a></li>
</ul>

<p><a href="https://yoomoney.ru/fundraise/BxB9DQNvJnk.230111"><img src="https://badgen.net/badge/gift/donate/green" alt="gift" /></a></p>
</div>


                </section>
    </main>
<script>
    function escapeHTML(html) {
        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
    }

    const originalContent = document.querySelector("main.pdoc");
    let currentContent = originalContent;

    function setContent(innerHTML) {
        let elem;
        if (innerHTML) {
            elem = document.createElement("main");
            elem.classList.add("pdoc");
            elem.innerHTML = innerHTML;
        } else {
            elem = originalContent;
        }
        if (currentContent !== elem) {
            currentContent.replaceWith(elem);
            currentContent = elem;
        }
    }

    function getSearchTerm() {
        return (new URL(window.location)).searchParams.get("search");
    }

    const searchBox = document.querySelector(".pdoc input[type=search]");
    searchBox.addEventListener("input", function () {
        let url = new URL(window.location);
        if (searchBox.value.trim()) {
            url.hash = "";
            url.searchParams.set("search", searchBox.value);
        } else {
            url.searchParams.delete("search");
        }
        history.replaceState("", "", url.toString());
        onInput();
    });
    window.addEventListener("popstate", onInput);


    let search, searchErr;

    async function initialize() {
        try {
            search = await new Promise((resolve, reject) => {
                const script = document.createElement("script");
                script.type = "text/javascript";
                script.async = true;
                script.onload = () => resolve(window.pdocSearch);
                script.onerror = (e) => reject(e);
                script.src = "../search.js";
                document.getElementsByTagName("head")[0].appendChild(script);
            });
        } catch (e) {
            console.error("Cannot fetch pdoc search index");
            searchErr = "Cannot fetch search index.";
        }
        onInput();

        document.querySelector("nav.pdoc").addEventListener("click", e => {
            if (e.target.hash) {
                searchBox.value = "";
                searchBox.dispatchEvent(new Event("input"));
            }
        });
    }

    function onInput() {
        setContent((() => {
            const term = getSearchTerm();
            if (!term) {
                return null
            }
            if (searchErr) {
                return `<h3>Error: ${searchErr}</h3>`
            }
            if (!search) {
                return "<h3>Searching...</h3>"
            }

            window.scrollTo({top: 0, left: 0, behavior: 'auto'});

            const results = search(term);

            let html;
            if (results.length === 0) {
                html = `No search results for '${escapeHTML(term)}'.`
            } else {
                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
            }
            for (let result of results.slice(0, 10)) {
                let doc = result.doc;
                let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
                if (doc.qualname) {
                    url += `#${doc.qualname}`;
                }

                let heading;
                switch (result.doc.kind) {
                    case "function":
                        if (doc.fullname.endsWith(".__init__")) {
                            heading = `<span class="name">${doc.fullname.replace(/\.__init__$/, "")}</span>${doc.signature}`;
                        } else {
                            heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span>${doc.signature}`;
                        }
                        break;
                    case "class":
                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
                        if (doc.bases)
                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
                        heading += `:`;
                        break;
                    case "variable":
                        heading = `<span class="name">${doc.fullname}</span>`;
                        if (doc.annotation)
                            heading += `<span class="annotation">${doc.annotation}</span>`;
                        if (doc.default_value)
                            heading += `<span class="default_value"> = ${doc.default_value}</span>`;
                        break;
                    default:
                        heading = `<span class="name">${doc.fullname}</span>`;
                        break;
                }
                html += `
                        <section class="search-result">
                        <a href="${url}" class="attr ${doc.kind}">${heading}</a>
                        <div class="docstring">${doc.doc}</div>
                        </section>
                    `;

            }
            return html;
        })());
    }

    if (getSearchTerm()) {
        initialize();
        searchBox.value = getSearchTerm();
        onInput();
    } else {
        searchBox.addEventListener("focus", initialize, {once: true});
    }

    searchBox.addEventListener("keydown", e => {
        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
            let focused = currentContent.querySelector(".search-result.focused");
            if (!focused) {
                currentContent.querySelector(".search-result").classList.add("focused");
            } else if (
                e.key === "ArrowDown"
                && focused.nextElementSibling
                && focused.nextElementSibling.classList.contains("search-result")
            ) {
                focused.classList.remove("focused");
                focused.nextElementSibling.classList.add("focused");
                focused.nextElementSibling.scrollIntoView({
                    behavior: "smooth",
                    block: "nearest",
                    inline: "nearest"
                });
            } else if (
                e.key === "ArrowUp"
                && focused.previousElementSibling
                && focused.previousElementSibling.classList.contains("search-result")
            ) {
                focused.classList.remove("focused");
                focused.previousElementSibling.classList.add("focused");
                focused.previousElementSibling.scrollIntoView({
                    behavior: "smooth",
                    block: "nearest",
                    inline: "nearest"
                });
            } else if (
                e.key === "Enter"
            ) {
                focused.querySelector("a").click();
            }
        }
    });
</script></body>
</html>